#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<queue>
#include<unordered_map>
#include<algorithm>
using namespace std;
class Solution9
{
public:
    int longestCommonSubsequence(string text1, string text2)
    {
        int n = text1.size(), m = text2.size(), ret = 0;
        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
        for (int i = 1;i < n + 1;i++)
            for (int j = 1;j < n + 1;j++)
            {
                if (text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
                else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                ret = max(ret, dp[i][j]);
            }
        return ret;
    }
};

class Solution6
{
public:
    int numDistinct(string s, string t)
    {
        int m = s.size(), n = t.size();
        vector<vector<int>> dp(n + 1, vector<int>(m + 1));
        for (int i = 0;i < m + 1;i++) dp[0][i] = 1;
        s = " " + s;t = " " + t;
        for (int i = 1;i < n + 1;i++)
            for (int j = 1;j < m + 1;j++)
            {
                dp[i][j] = dp[i][j - 1];
                if (t[i] == s[j]) dp[i][j] += dp[i - 1][j - 1];
            }
        return dp[n][m];
    }
};
class Solution44
{
public:
    bool isMatch(string s, string p)
    {
        int m = s.size(), n = p.size();
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
        s = " "+s;p = " " + p;
        dp[0][0] = true;
        for (int i = 1;i < n + 1;i++)
            if (p[i] == '*') dp[0][i] = true;
            else break;
        for (int i = 1;i < m + 1;i++)
            for (int j = 1;j < n + 1;j++)
            {
                if (p[j] == '?' || s[i] == p[j]) dp[i][j] = dp[i - 1][j - 1];
                else if (p[j] == '*') dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
            }
        return dp[m][n];

    }
};
class Solution
{
public:
    bool isInterleave(string s1, string s2, string s3)
    {
        s1 = " " + s1;s2 = " " + s2;s3 = " " + s3;
        int m = s1.size(), n = s2.size();
        vector<vector<bool>> dp(m, vector<bool>(n));
        dp[0][0] = true;
        for (int i = 1;i < m;i++)
            if (s1[i] == s3[i]) dp[i][0] = true;
            else break;
        for (int i = 1;i < n;i++)
            if (s2[i] == s3[i]) dp[0][i] = true;
            else break;
        for (int i = 1;i < m;i++)
            for (int j = 1;j < n;j++)
            {
                if (i == 2 && j == 1)
                {
                    int a = 0;
                }
                if ((s3[i + j] == s1[i] && dp[i - 1][j]) || (s3[i + j] == s2[j] && dp[i][j - 1]))
                    dp[i][j] = true;
            }
        return dp[m - 1][n - 1];

    }
};
int main()
{
    Solution().isInterleave("aabcc", "dbbca", "aadbbcbcac");
	return 0;
}